#include <bits/stdc++.h> //万能头文件
using namespace std;
int main()
{
    // for_each: lambda表达式里面加&，能修改值
    // vector<int> v = {1, 2, 3, 3, 3, 4, 5};
    // for_each(v.begin(), v.end(), [](int &a)
    //          {a++;cout<<a<<" "; });
    // cout<<endl;

    // copy:从一个元素开始，复制某段区间
    // vector<int> v = {1, 2, 3, 3, 3, 4, 5};
    // list<int> l;
    // l.resize(v.size()); //copy前一定要先扩容
    // copy(v.begin(), v.end(), l.begin());
    // for_each(l.begin(), l.end(), [](int &a)
    //          {cout<<a<<" "; });

    // copy_backward:从最后一个元素开始，复制某段区间，顺序没变，但是要从end迭代器开始
    // vector<int> v = {1, 2, 3, 3, 3, 4, 5};
    // list<int> l;
    // l.resize(v.size()); // copy前一定要先扩容
    // copy_backward(v.begin(), v.end(), l.end());
    // for_each(l.begin(), l.end(), [](int &a)
    //          { cout << a << " "; });

    // transform:复制一个区间的元素对其进行操作后复制到新容器中
    vector<int> v = {1, 2, 3, 3, 3, 4, 5};
    list<int> l;
    l.resize(v.size());
    transform(v.begin(), v.end(), l.begin(),[](int a){return ++a;});
        for_each(v.begin(), v.end(), [](int &a)
             { cout << a << " "; });
             std::cout<<std::endl;
    for_each(l.begin(), l.end(), [](int &a)
             { cout << a << " "; });

    // merge:归并两个区间
    // vector<int> v = {1, 2, 3, 3, 3, 4, 5};
    // list<int> l = {1,2,3,4,7,8,9};
    // vector<int> v2;
    // v2.resize(v.size()+l.size());
    // merge(v.begin(),v.end(),l.begin(),l.end(),v2.begin());
    //     for_each(v2.begin(), v2.end(), [](int &a)
    //          { cout << a << " "; });

    //swap_ranges:交换两区间的元素
    // vector<int> v = {1, 2, 3, 3, 3, 4, 5};
    // list<int> l = {1, 2, 3, 4, 7, 8, 9};
    // swap_ranges(v.begin(), v.end(), l.begin());
    // for_each(v.begin(), v.end(), [](int a)
    //          { cout << "v:" << a << " "; });
    // cout << endl;
    // for_each(l.begin(), l.end(), [](int a)
    //          { cout << "l:" << a << " "; });
    // cout << endl;

    // fill：以给定值替换每一个元素
    // 数组用fill，list用fill_n
    //  vector<int> v = {1, 2, 3, 3, 3, 4, 5};
    //  list<int> l = {1, 2, 3, 4, 7, 8, 9};
    //  fill(v.begin(), v.end(), 0);
    //  for_each(v.begin(), v.end(), [](int a)
    //           { cout << a << " "; });

    // fill_n: 以给定值替换n个元素
    //  fill_n(l.begin(),3,0);
    //  for_each(l.begin(), l.end(), [](int a)
    //           { cout << a << " "; });

    // generate:以某一项操作的结果替换每一个元素
    // vector<int> v = {1, 2, 3, 3, 3, 4, 5};
    // int a = 0;
    // generate(v.begin(), v.end(), [&a]()
    //          { return ++a; });
    // for_each(v.begin(), v.end(), [](int &a)
    //          { cout << a << " "; });

    // replace:将具有某特定值的元素替换成另一个值
    // vector<int> v = {1, 1, 2, 3, 4, 5};
    // replace(v.begin(), v.end(), 1, 99);
    // for_each(v.begin(), v.end(), [](int a)
    //          { cout << a << " "; });

    // replace_copy:复制整个区间，同时将具有某特定值得元素替换为另一个值，原区间不动
    // vector<int> v = {1, 1, 2, 3, 4, 5};
    // vector<int> v2;
    // v2.resize(v.size());
    // replace_copy(v.begin(),v.end(),v2.begin(),1,99);
    // for_each(v.begin(),v.end(),[](int a){cout<<a<<" ";});
    // cout<<endl;
    // for_each(v2.begin(),v2.end(),[](int a){cout<<a<<" ";});
    // cout<<endl;

    // replace_if:将符合某一条件的元素替换为另一个值
    // vector<int> v = {1, 2, 3, 4, 5, 6, 7};
    // replace_if(v.begin(), v.end(), [](int &a)
    //            { return a < 4; }, 99);
    // for_each(v.begin(), v.end(), [](int a)
    //          { cout << a << " "; });
    // cout << endl;


    // replace_copy_if:复制整个区间，同时将满足某一条件的元素替换为另一个元素
    // vector<int> v = {1, 1, 2, 3, 4, 5};
    // vector<int> v2;
    // v2.resize(v.size());
    // replace_copy_if(v.begin(),v.end(),v2.begin(),[](int a){return a<3;},99);
    // for_each(v.begin(),v.end(),[](int a){cout<<a<<" ";});
    // cout<<endl;
    // for_each(v2.begin(),v2.end(),[](int a){cout<<a<<" ";});
    // cout<<endl;

    return 0;
}